package com.hp.utils;

import redis.clients.jedis.*;

import java.util.*;


/**
 * 操作redis的常用方法,可自行拓展
 * 用法:
 *      1.修改init方法中的IP和端口
 *      2.直接调用相应方法即可
 *
 *
 * smile
 */
public class ClustersUtil {
    public static boolean status=true; //是否开启了缓存
    public static boolean openOrCloseEmpty=false; //是否清空缓存
    public static JedisPoolConfig config = new JedisPoolConfig();       //连接池配置
    public static JedisCluster jc = null;       //集群


    //初始化
    public static void init(){
        // 最大连接数
        config.setMaxTotal(30);
        // 最大连接空闲数
        config.setMaxIdle(2);
        //集群结点
        Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
        jedisClusterNode.add(new HostAndPort("47.105.104.49", 7001));
        jedisClusterNode.add(new HostAndPort("47.105.104.49", 7002));
        jedisClusterNode.add(new HostAndPort("47.105.104.49", 7003));
        jedisClusterNode.add(new HostAndPort("47.105.104.49", 7004));
        jedisClusterNode.add(new HostAndPort("47.105.104.49", 7005));
        jedisClusterNode.add(new HostAndPort("47.105.104.49", 7006));
        jc = new JedisCluster(jedisClusterNode, config);
    }




    /**
     * 获取所有key
     * @return
     */
    public static Set<String> getkeys(){
        init();
        //Set是一个不包含重复元素的 collection
        Set<String> keys = new TreeSet<>();     //所有键
        Map<String, JedisPool> clusterNodes = jc.getClusterNodes();     //获取所有redis集群,key值:192.168.146.129:7001
        for(String k : clusterNodes.keySet()) {
            JedisPool jp = clusterNodes.get(k); //得到redis连接池
            Jedis connection = jp.getResource();    //从连接池获取 jedis 对象
            keys.addAll(connection.keys("*"));  //表示获取所有集群下的key
        }
        return keys;
    }




    /**
     * 存储数据到redis
     * @param key
     * @param val
     * @return  是否成功
     */
    public static boolean addData(String key,String val){
        init(); //先初始化
        //当数据存储成功时,返回的是OK
        if(jc.set(key,val).equals("OK")){
            return true;
        }else{
            return false;
        }
    }




    /**
     * 清空集群的所有数据
     * @return
     */
    public static void empty(){
        init(); //如果初始化了则不需要该方法
        for(String key : getkeys()){
            jc.del(key);
        }
    }





    /**
     * 通过key返回数据
     * @param key
     * @return
     */
    public static String findKeyVal(String key){
        init();
        return jc.get(key);
    }



    /**
     * 获取集群的所有键值对
     * @return
     */
    public static Map<String,String> getAllKeyAndVal(){
        init();
        Map map=new HashMap();
        Set<String> keySet=getkeys();   //得到所有键集合
        //遍历键,用来获取键对应的数据
        for(String key : keySet){
            String k=key;           //这个是key
            String v=jc.get(key);   //这个是键对应的值
            map.put(key,jc.get(key));   //将获取的键值对存储到map
        }
        return map;
    }




    /**
     * 通过key删除数据
     * @param key
     */
    public static Boolean delData(String key){
        init();
        Long delIndex=jc.del(key);  //删除成功返回1,删除失败返回0
        System.out.println(delIndex);
        if(delIndex!=0){
            return true;
        }else{
            return false;
        }
    }





    //测试
    public static void main(String[] args) {
        /*Set<String> keys=getkeys();
        for(String key : keys){
            System.out.println(key);
        }*/
        //empty();
       /*boolean is = addData("Hello","dads");
        System.out.println(is);*/
        /*String data=findKeyVal("Hello");
        System.out.println(data);*/
        Map<String,String> map=getAllKeyAndVal();
        for(Map.Entry<String, String> entry:map.entrySet()){
            System.out.println(entry.getKey()+"\t"+entry.getValue());
        }
        //delData("Hello");
    }
}
